// // #include <Arduino.h>
// // #include <PubSubClient.h>
// // #include <WiFi.h>
// // #include <Ticker.h>
// // #include <WiFiClientSecure.h>
// // #include "OLEDDisplay.h"
// // #include "MQ2Sensor.h"
// // #include <DHT.h>
// // #include <Wire.h>

// // #define product_id  "ZwQ1ozNTiF"
// // #define device_id  "DHT11"
// // #define token  "version=2018-10-31&res=products%2FZwQ1ozNTiF%2Fdevices%2FDHT11&et=1903525893&method=md5&sign=haLdBAU1q3iOG23ijwqwdw%3D%3D"

// // // 硬件引脚定义
// // #define MQ2_PIN 34
// // #define MQ2_DOUT_PIN 35
// // #define LED 2
// // #define DHTPIN 25       // DHT11数据引脚
// // #define DHTTYPE DHT11   // DHT类型

// // // 全局变量
// // int postMsgID = 0;
// // float temp = 0;
// // int humid = 0;
// // float ppm = 0;
// // unsigned long mq2StartTime = millis();
// // bool mq2Ready = false;

// // // 传感器对象初始化
// // MQ2Sensor mq2(MQ2_PIN);
// // DHT dht(DHTPIN, DHTTYPE);
// // EnvMonitorDisplay oled;

// // // OneNET配置
// // #define ONENET_TOPIC_PROP_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"params\":{\"humid\":{\"value\":%d},\"temp\":{\"value\":%.1f},\"smoke_level\":{\"value\":%.1f}}}"
// // #define ONENET_TOPIC_PROP_POST "$sys/" product_id "/" device_id "/thing/property/post"
// // #define ONENET_TOPIC_PROP_SET "$sys/" product_id "/" device_id "/thing/property/set"
// // #define ONENET_TOPIC_PROP_SET_REPLY "$sys/" product_id "/" device_id "/thing/property/set_reply"
// // #define ONENET_TOPIC_PROP_POST_REPLY "$sys/" product_id "/" device_id "/thing/property/post_reply"

// // // 网络配置
// // const char* ssid = "ManBo";
// // const char* password = "hhgyzqzysdkl";
// // const char* mqtt_server = "mqtts.heclouds.com";
// // const int mqtt_port = 1883;

// // WiFiClient espClient;
// // PubSubClient client(espClient);
// // Ticker ticker;

// // // 函数声明
// // void LED_Flash(int time);
// // void WiFi_Connect();
// // void OneNet_Connect();
// // void OneNet_Prop_Post();
// // void readDHT11();
// // void checkConnection();

// // void setup() {
// //   pinMode(LED, OUTPUT);
// //   pinMode(MQ2_DOUT_PIN, INPUT);
// //   Serial.begin(9600);
  
// //   // 初始化硬件
// //   if(!oled.begin()) {
// //     Serial.println("OLED初始化失败!");
// //     while(1);
// //   }
  
// //   mq2.begin();
// //   dht.begin();
  
// //   // 显示启动画面
// //   oled.showSplashScreen("环境监测系统", "启动中...");
// //   delay(2000);
  
// //   // 连接网络
// //   WiFi_Connect();
// //   OneNet_Connect();
  
// //   ticker.attach(10, OneNet_Prop_Post);
// //   Serial.println("系统就绪");
// // }

// // void loop() {
// //   // 网络维护
// //   checkConnection();
// //   client.loop();

// //   // 传感器处理
// //   static uint32_t lastSensorUpdate = 0;
// //   if (millis() - lastSensorUpdate > 2000) { // 2秒读取间隔
// //     readDHT11();
    
// //     if(mq2.isStable()) {
// //       ppm = mq2.readSmokeLevel();
// //       Serial.printf("传感器数据: %.1f°C %d%% %.1fPPM\n", temp, humid, ppm);
// //     }
    
// //     lastSensorUpdate = millis();
// //   }

// //   // OLED显示更新
// //   oled.update(temp, humid, 
// //              mq2.isStable() ? ppm : -1.0f,
// //              WiFi.status() == WL_CONNECTED,
// //              client.connected(),
// //              postMsgID);
// // }

// // void checkConnection() {
// //   static uint32_t lastCheck = 0;
// //   if (millis() - lastCheck > 5000) { // 5秒检查一次
// //     if (WiFi.status() != WL_CONNECTED) {
// //       Serial.println("WiFi断开，尝试重连...");
// //       WiFi_Connect();
// //     }
// //     if (!client.connected()) {
// //       Serial.println("MQTT断开，尝试重连...");
// //       OneNet_Connect();
// //     }
// //     lastCheck = millis();
// //   }
// // }

// // void readDHT11() {
// //   float newTemp = dht.readTemperature();
// //   float newHumid = dht.readHumidity();
  
// //   if (!isnan(newTemp) && !isnan(newHumid)) {
// //     temp = newTemp;
// //     humid = (int)newHumid;
// //   } else {
// //     Serial.println("读取DHT11失败!");
// //   }
// // }

// // void WiFi_Connect() {
// //   if(WiFi.status() == WL_CONNECTED) return;
  
// //   WiFi.begin(ssid, password);
// //   Serial.print("连接WiFi");
  
// //   int attempts = 0;
// //   while (WiFi.status() != WL_CONNECTED && attempts++ < 20) {
// //     digitalWrite(LED, !digitalRead(LED));
// //     Serial.print(".");
// //     delay(500);
// //   }
  
// //   if(WiFi.status() == WL_CONNECTED) {
// //     Serial.println("\n连接成功! IP: " + WiFi.localIP().toString());
// //     digitalWrite(LED, HIGH);
// //   } else {
// //     Serial.println("\n连接失败!");
// //   }
// // }

// // void OneNet_Connect() {
// //   if(client.connected()) return;
  
// //   client.setServer(mqtt_server, mqtt_port);
// //   Serial.print("连接OneNET");
  
// //   int attempts = 0;
// //   while (!client.connect(device_id, product_id, token) && attempts++ < 5) {
// //     digitalWrite(LED, !digitalRead(LED));
// //     Serial.print(".");
// //     delay(1000);
// //   }
  
// //   if(client.connected()) {
// //     Serial.println("\n连接成功!");
// //     client.subscribe(ONENET_TOPIC_PROP_SET);
// //     client.subscribe(ONENET_TOPIC_PROP_POST_REPLY);
// //     digitalWrite(LED, HIGH);
// //   } else {
// //     Serial.println("\n连接失败!");
// //   }
// // }

// // void OneNet_Prop_Post() {
// //   if(!client.connected()) return;
  
// //   char payload[150];
// //   snprintf(payload, sizeof(payload), ONENET_TOPIC_PROP_FORMAT,
// //           postMsgID++, humid, temp, ppm);
  
// //   if(client.publish(ONENET_TOPIC_PROP_POST, payload)) {
// //     Serial.println("数据上报: " + String(payload));
// //     digitalWrite(LED, !digitalRead(LED));
// //   } else {
// //     Serial.println("上报失败!");
// //   }
// // }

// // void LED_Flash(int time) {
// //   digitalWrite(LED, HIGH);
// //   delay(time);
// //   digitalWrite(LED, LOW);
// //   delay(time);
// // }
















// #pragma once
// #include <Arduino.h>

// class MotionSensor {
// public:
//     // 设备专属配置（与main.cpp解耦）
//     static constexpr const char* PRODUCT_ID = "ZwQ1ozNTiF";
//     static constexpr const char* DEVICE_ID = "Human";
//     static constexpr const char* TOKEN = "version=2018-10-31&res=products%2FZwQ1ozNTiF%2Fdevices%2FHuman&et=1904056176000&method=md5&sign=%2F1GhEu44%2FdlMIfVPFPNyag%3D%3D";


//     MotionSensor(uint8_t pin, PubSubClient& client);
//     void begin();
//     void update(); // 新增状态上报逻辑
//     bool isHumanDetected();
    
// private:
//     void _publishState();
//     uint8_t _pin;
//     bool _lastState = false;
//     PubSubClient& _mqttClient;
// };  


// #include "MotionSensor.h"
// #include <ArduinoJson.h>
// #include <PubSubClient.h>

// MotionSensor::MotionSensor(uint8_t pin, PubSubClient& client) 
//     : _pin(pin), _mqttClient(client) {}

// void MotionSensor::begin() {
//     pinMode(_pin, INPUT);
//     Serial.printf("[Motion] 设备ID:%s | 初始化完成\n", DEVICE_ID);
// }

// void MotionSensor::update() {
//     bool current = digitalRead(_pin);
//     if(current != _lastState) {
//         _lastState = current;
//         _publishState();
//     }
// }

// void MotionSensor::_publishState() {
//     if(!_mqttClient.connected()) return;

//     DynamicJsonDocument doc(128);
//     doc["id"] = millis();
//     doc["params"]["human_detect"] = _lastState;

//     char payload[80];
//     serializeJson(doc, payload);

//     String topic = "$sys/" + String(PRODUCT_ID) + "/" 
//                  + DEVICE_ID + "/thing/property/post";
    
//     if(_mqttClient.publish(topic.c_str(), payload)) {
//         Serial.printf("[Motion] 上报成功: %s\n", payload);
//     }
// }

// bool MotionSensor::isHumanDetected() {
//     return _lastState;
// }
